package org.xx.b2d;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

/**
 * 场景。
 */
public abstract class Scene {
    private Color background;

    private volatile boolean initialized;

    private int frameRate;

    public Scene() {
        this.background = Color.BLACK;
        this.initialized = false;
        this.frameRate = 50;
    }

    public Color getBackground() {
        return this.background;
    }

    /**
     * 设置场景的底背景颜色。
     *
     * @param color
     *         底背景颜色。
     */
    public void setBackground(
            Color color
    ) {
        this.background = color;
    }

    /**
     * 初始化场景。
     *
     * <p>如果已经执行过初始化则直接返回。</p>
     */
    public final synchronized void init() {
        if (this.initialized) {
            return;
        }

        initSelf();

        this.initialized = true;

        doInit();
    }

    private void initSelf() {
    }

    /**
     * 执行初始化。
     *
     * <p>此处应当初始化背景、精灵。并设置事件。</p>
     */
    protected abstract void doInit();

    /**
     * 更新场景。
     *
     * @param steps
     *         距离上一次更新的步数。
     */
    public final synchronized void update(
            int steps
    ) {
        if (!this.initialized) {
            throw new IllegalStateException("");
        }

        if (steps <= 0) {
            return;
        }

        updateSelf(steps);

        doUpdate();
    }

    private void updateSelf(
            int steps
    ) {
    }

    /**
     * 执行更新。
     * <p>此处应当初始化背景、精灵。并设置事件。</p>
     */
    protected abstract void doUpdate();

    public final synchronized void draw(
            Graphics g,
            Dimension size
    ) {
        g.setColor(Color.BLUE);
        g.fillRect(0, 0, size.width, size.height);
    }

    /**
     * 清除场景的所有元素，包括背景和精灵。
     */
    public void clearAll() {
    }
}